package InitializeOrder;

public class Exten {

	       static int num = 4;                    // 静态变量第二个
	           {
	              num += 3;
	              System.out.println("b");
	           }
	       int a = 5;{                             // 成员变量第三个
	              System.out.println("c");
	           }
	       Exten()
	           {                                         // 类的构造函数，第四个加载
	              System.out.println("d");
	           }
	       static
	           {                                        // 静态块，第一个加载
	              System.out.println("a");
	           }
	       static void run()                     // 静态方法，调用的时候才加载// 注意看，e没有加载
	           {
	              System.out.println("e");
	           }
	       public static void main(String[] args)
	           {
	             //new Exten();
	              new Exten().run();
	           }
}
/*
一般顺序：静态块——>静态变量——>成员变量——>构造方法——>静态方法
1、静态代码块（只加载一次） 2、构造方法（创建一个实例就加载一次）3、静态方法需要调用才会执行，所以最后结果没有e

想知道顺序看看控制台！是不是一目了然了，*/


/*
     public class Exten {
	  static int count = 2;      //定义静态变量（类变量）count，这个不是比较对象，下面的name是
	  static String name = "我的黑马之路";     //定义静态变量5.
	  static {              //通过静态初始化块为name变量初始化
	  System.out.println("StaticInitTest的静态初始化块！");
	  name = "黑马编程";
	  }
	  public static void main(String[] args) {
	  System.out.println("count的值："+Exten.count);
	  System.out.println("name的值："+Exten.name);
	  }
	 }  
     
     //     StaticInitTest的静态初始化块！
     //     count的值：2
     //     name的值：黑马编程
     //
*/
  /*   大补充：
      -----******先把内在的执行规律简述：******-----
	• 静态变量这个问题是最不容易搞明白的问题，静态变量只加载一次，以后不论你怎么new不会再加载
	• 而且注意：静态块也是仅加载一次，
	• 静态变量后大括号内有代码的话，new一次执行一次。
	• 静态块加载的时候大括号内的语句就执行完毕，以后不会执行。
   

     A、类的初始化顺序如下：
     ->1、为静态属性分配内存并赋值（后面大括号语句不执行，这里是初始化，只是添加变量和值） 
              或  执行静态代码块（立刻执行大括号里面的语句）
               为什么这样说呢，因为谁在前先加载谁，包括静态属性之间，和静态块之间的顺序，
               但是注意，虽然顺序都可以当第一，但是静态块、静态属性执行的东西完全不一样，
     ->2、为非静态属性分配内存并赋值

     ->3、构造方法（实际上这个先于非静态属性调用到，只是构造方法里面的语句暂停执行，等到非静态属性加载完才执行）
     ->4、执行非静态代码块 或 静态方法（都是调用了才加载）。



     --------------------------------------------------------------------------------


     B、类的代码(大括号内的语句)执行顺序：   当你创建了对象的时候才会用到各个属性和变量对不对，这里就是这个顺序

     ->1、执行静态代码块（大括号包含的语句立刻执行，绝对是第一位的执行，没有能和它平级的）
     ->2、静态属性 （第二位执行）
     ->3、为非静态属性分配内存并赋值（大括号内语句第三位执行）
     ->4、构造函数
     ->执行非静态代码块 或 静态方法（都是调用了才加载）。*/


